#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include   "queue"

using namespace std;

/*
 *
 * 在给定的 m x n 网格 grid 中，每个单元格可以有以下三个值之一：
值 0 代表空单元格；
值 1 代表新鲜橘子；
值 2 代表腐烂的橘子。
每分钟，腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能，返回 -1 。

示例 1：

输入：grid = [[2,1,1],[1,1,0],[0,1,1]]
输出：4
示例 2：

输入：grid = [[2,1,1],[0,1,1],[1,0,1]]
输出：-1
解释：左下角的橘子（第 2 行， 第 0 列）永远不会腐烂，因为腐烂只会发生在 4 个正向上。
示例 3：

输入：grid = [[0,2]]
输出：0
解释：因为 0 分钟时已经没有新鲜橘子了，所以答案就是 0 。
 *
 * */

int orangesRotting(vector<vector<int>> &grid) {
    int row = grid.size();
    int col = grid[0].size();

    queue<pair<int, int>> q;
    int countGood = 0;
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            //把腐烂的橘子加入队列
            if (grid[i][j] == 2) {
                q.push({i, j});
            } else if (grid[i][j] == 1) {
                ++countGood;
            }
        }
    }

    int count = 0;//统计层数
    while (countGood > 0 && !q.empty()) {
        ++count;
        int size = q.size();

        for (int i = 0; i < size; ++i) {
            auto item = q.front();
            q.pop();
            //行
            if (item.first + 1 < row && grid[item.first + 1][item.second] == 1) {
                grid[item.first + 1][item.second] = 2;
                --countGood;
                q.push({item.first + 1, item.second});
            }
            if (item.first - 1 >= 0 && grid[item.first - 1][item.second] == 1) {
                grid[item.first - 1][item.second] = 2;
                --countGood;
                q.push({item.first - 1, item.second});
            }
            if (item.second + 1 < col && grid[item.first][item.second + 1] == 1) {
                grid[item.first][item.second + 1] = 2;
                --countGood;
                q.push({item.first, item.second + 1});
            }
            if (item.second - 1 >= 0 && grid[item.first][item.second - 1] == 1) {
                grid[item.first][item.second - 1] = 2;
                --countGood;
                q.push({item.first, item.second - 1});
            }

        }

    }


    if (countGood > 0)
        return -1;
    return count;
}